home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Headers / mach-o / nlist.h < prev    next >
C/C++ Source or Header  |  1994-01-11  |  5KB  |  130 lines

  1. #ifndef _MACHO_NLIST_H_
  2. #define _MACHO_NLIST_H_
  3. /*
  4.  * Copyright (c) 1980 Regents of the University of California.
  5.  * All rights reserved.  The Berkeley software License Agreement
  6.  * specifies the terms and conditions for redistribution.
  7.  *
  8.  *    @(#)nlist.h    5.1 (Berkeley) 5/30/85
  9.  */
  10.  
  11. /*
  12.  * Format of a symbol table entry of a Mach-O file.  Modified from the 4.3BSD
  13.  * format.  The modifications from the original format were changing n_other
  14.  * (an unused field) to n_sect and the addition of the N_SECT type.  These
  15.  * modifications are required to support symbols in an arbitrary number of
  16.  * sections not just the three sections (text, data and bss) in a 4.3BSD file.
  17.  */
  18. struct nlist {
  19.     union {
  20.         char *n_name;    /* for use when in-core */
  21.         long  n_strx;    /* index into the string table */
  22.     } n_un;
  23.     unsigned char n_type;    /* type flag, see below */
  24.     unsigned char n_sect;    /* section number or NO_SECT */
  25.     short          n_desc;    /* see <mach-o/stab.h> */
  26.     unsigned long n_value;    /* value of this symbol (or stab offset) */
  27. };
  28.  
  29. /*
  30.  * Symbols with a index into the string table of zero (n_un.n_strx == 0) are
  31.  * defined to have a null, "", name.  Therefore all string indexes to non null
  32.  * names must not have a zero string index.  This is bit historical information
  33.  * that has never been well documented.
  34.  */
  35.  
  36. /*
  37.  * The n_type field really contains three fields:
  38.  *    unsigned char N_STAB:3,
  39.  *              N_PEXT:1,
  40.  *              N_TYPE:3,
  41.  *              N_EXT:1;
  42.  * which are used via the following masks.
  43.  */
  44. #define    N_STAB    0xe0  /* if any of these bits set, a symbolic debugging entry */
  45. #define    N_PEXT    0x10  /* private external symbol bit */
  46. #define    N_TYPE    0x0e  /* mask for the type bits */
  47. #define    N_EXT    0x01  /* external symbol bit, set for external symbols */
  48.  
  49. /*
  50.  * Only symbolic debugging entries have some of the N_STAB bits set and if any
  51.  * of these bits are set then it is a symbolic debugging entry (a stab).  In
  52.  * which case then the values of the n_type field (the entire field) are given
  53.  * in <mach-o/stab.h>
  54.  */
  55.  
  56. /*
  57.  * Values for N_TYPE bits of the n_type field.
  58.  */
  59. #define    N_UNDF    0x0        /* undefined, n_sect == NO_SECT */
  60. #define    N_ABS    0x2        /* absolute, n_sect == NO_SECT */
  61. #define    N_SECT    0xe        /* defined in section number n_sect */
  62. #define N_INDR    0xa        /* indirect */
  63.  
  64. /* 
  65.  * If the type is N_INDR then the symbol is defined to be the same as another
  66.  * symbol.  In this case the n_value field is an index into the string table
  67.  * of the other symbol's name.  When the other symbol is defined then they both
  68.  * take on the defined type and value.
  69.  */
  70.  
  71. /*
  72.  * If the type is N_SECT then the n_sect field contains an ordinal of the
  73.  * section the symbol is defined in.  The sections are numbered from 1 and 
  74.  * refer to sections in order they appear in the load commands for the file
  75.  * they are in.  This means the same ordinal may very well refer to different
  76.  * sections in different files.
  77.  *
  78.  * The n_value field for all symbol table entries (including N_STAB's) gets
  79.  * updated by the link editor based on the value of it's n_sect field and where
  80.  * the section n_sect references gets relocated.  If the value of the n_sect 
  81.  * field is NO_SECT then it's n_value field is not changed by the link editor.
  82.  */
  83. #define    NO_SECT        0    /* symbol is not in any section */
  84. #define MAX_SECT    255    /* 1 thru 255 inclusive */
  85.  
  86. /*
  87.  * Common symbols are represented by undefined (N_UNDF) external (N_EXT) types
  88.  * who's values (n_value) are non-zero.  In which case the value of the n_value
  89.  * field is the size (in bytes) of the common symbol.  The n_sect field is set
  90.  * to NO_SECT.
  91.  */
  92.  
  93. /*
  94.  * To support the lazy binding of undefined symbols in the dynamic link-editor,
  95.  * the undefined symbols in the symbol table (the nlist structures) are marked
  96.  * with the indication if the undefined reference is a lazy reference or
  97.  * non-lazy reference.  If both a non-lazy reference and a lazy reference is
  98.  * made to the same symbol the non-lazy reference takes precedence.  A reference
  99.  * is lazy only when all references to that symbol are made through a symbol
  100.  * pointer in a lazy symbol pointer section.
  101.  *
  102.  * The implementation of marking nlist structures in the symbol table for
  103.  * undefined symbols will be to use some of the bits of the n_desc field as a
  104.  * reference type.  The mask REFERENCE_TYPE will be applied to the n_desc field
  105.  * of an nlist structure for an undefined symbol to determine the type of
  106.  * undefined reference (lazy or non-lazy).
  107.  *
  108.  * The constants for the REFERENCE FLAGS are propagated to the reference table
  109.  * in a shared library file.  In that case the constant for a defined symbol,
  110.  * REFERENCE_FLAG_DEFINED, is also used.
  111.  */
  112. /* Reference type bits of the n_desc field of undefined symbols */
  113. #define REFERENCE_TYPE                0xff
  114. /* types of references */
  115. #define REFERENCE_FLAG_UNDEFINED_NON_LAZY        0
  116. #define REFERENCE_FLAG_UNDEFINED_LAZY            1
  117. #define REFERENCE_FLAG_DEFINED                2
  118. #define REFERENCE_FLAG_PRIVATE_DEFINED            3
  119. #define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY    4
  120. #define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY        5
  121.  
  122. #ifndef __STRICT_BSD__
  123. /*
  124.  * The function nlist(3) from the C library.
  125.  */
  126. extern int nlist (const char *filename, struct nlist *list);
  127. #endif __STRICT_BSD__
  128.  
  129. #endif _MACHO_LIST_H_
  130.